
/**
 * 通用View实现，实现了各种组件的抽象实现，用于后期组件的快速构建，View路径module/common/views/CommonUIView
 * @class ngc.component.view.CommonUIView
 */
define(function() {
	
	var CommonView = ngc.View.extend({
		el: false,
		template: ngc.compile('<div id="{{id}}" class="res_component"></div>'),
		serialize:function(){
			var _obj_id = this._obj_id = ngc.getUUID();
			return {id:_obj_id};
		},
		/**
		 * @method 获取通用组件配置
		 * @private 
		 */
		getOptionConfig:function(){
			return this.options.config;
		},
		
		/**
		 * 设置视图组件初始化成功标记
		 * @method setInitFlag
		 * @param {Boolean} flag 组件内部是否初始化完成
		 */
		setInitFlag:function(flag){
			this._res_component_has_init = flag;
		},
		
		/**
		 * 启用/禁用覆盖层
		 * @method progress
		 * @param {String} [mess] 可选参数，遮罩层显示文字
		 */
		progress:function(mess){
			var $content = this.getComponentObject();
            if ($content.data('blockui-content')) {
                $content.unblockUI().data('blockui-content', false);
            } else {
                $content.blockUI({
                    message: mess||'加载中'
                }).data('blockui-content', true);
            }
		},
		
		/**
		 * 获取视图组件初始化成功标记
		 * @method getInitFlag
		 * @return {Boolean} 组件内部是否初始化完成，true-初始化完成，false-未初始化完成
		 */
		getInitFlag:function(){
			return this._res_component_has_init?this._res_component_has_init:false;
		},
		
		/**
		 * @method 设置通用组件配置
		 * @param cfg:配置参数，View构造方法传入的config参数，通用组件配置参数设置
		 * @private
		 */
		setOptionConfig:function(cf){
			this.options.config = cf;
			this.trigger("viewOptionChange");
		},
		
		
		/**
		 * 获取视图的所有参数
		 * @return {Object}
		 * 
		 */
		getOption:function(){
			return this.options;
		},

		/**
		 * @method 获取当前组件的jquery对象，主要用于组件内部使用，通常情况下不建议组件使用者调用
		 */
		getComponentObject : function() {
			return this.$el;
		},
		
		/**
		 * @method 获取当前组件ID主面板的jquery对象，主要用于组件内部使用，通常情况下不建议组件使用者调用
		 */
		getMainObject : function() {
			return this.$('#'+this.getComponentId());
		},
		
		/**
		 * 获取组件定义的根节点全局唯一的ID
		 * @method getComponentId
		 * @return {String} 创建的组件ID
		 */
		getComponentId:function(){
			return this._obj_id;
		},
		//右键菜单支持
		/**
		 *@method 初始化右键菜单，启用右键菜单
		 *@param {Array} config：需要初始化的菜单数组。
		 *@param {String} config.id 
		 *@param {String} config.label 
		 *@param {String} config.icon
		 *@param {Number} config.index 
		 *@param {Function} [onContextMenu] 右键菜单初始化前执行函数，用于决定是否显示菜单项以及相关菜单
		 *<pre>
		 *
		 *格式[{id:'test1',label:'添加数据'},{id:'test2',label:'删除数据'},{id:'test3',label:'修改数据'},{id:'test4',label:'查看数据',index:0}]
		 *</pre>
		 *			
		 */
		attachMenu:function(config,onContextMenu){
			var that = this;
			
			var _menuDivId = ngc.getUUID();
			this.getComponentObject().append('<div id="'+_menuDivId+'"></div>');
			
			this.requireView({selector:"#"+_menuDivId,url:"module/component/views/MenuView"}).then(function(){
				var _tmp_menu = that.getView("#"+_menuDivId);
				var _conf = {bindings:{}};
				
				_conf.onContextMenu = function(e,m){
					_tmp_menu.showMenu();
					var _t = that._doOnBeforeMenu(e);
					if(_t===false)return false;
					if(onContextMenu){
						
						that.trigger('onContextMenu',_tmp_menu,e,m);
						
						return onContextMenu.call(_tmp_menu,that,e,m);
					}
					
					return true;
				}
				
				//找出所有的parent进行排序放到所有的最后
				var _tmpParent = {};
				$.each(config||[],function(i){
					if(this.parent){
						_tmpParent[this.parent] = {};
					}
						
				});
				
				$.each(config||[],function(i){
					if(!_tmpParent[this.id]){
						_conf.bindings[_tmp_menu.getRelMenuId(this.id)] = function(e,k,id){
							that.onMenuEvent(_tmp_menu.getDefineMenuId(id),_tmp_menu,e);
						}
					}
					
				});
				_tmp_menu.addMenus(config);
				_tmp_menu.initMenu(that._getMenuClickObj(),_conf);
			});
			this.$("#"+_menuDivId).hide();
		},
		/**
		 * @method 决定右键菜单是否显示
		 * @abstract
		 * @private
		 */
		_doOnBeforeMenu:function(e){
			return true;
		},
		
		/**
		 * @method 获取右键可用区域
		 * @private
		 * @abstract
		 */
		_getMenuClickObj:function(){
			return this.getComponentObject();
		},
		/**
		 * @method Menu事件处理的模板,一般由基于公共的子类进行具体事件的处理，便于相关参数的传递
		 * @param id:被点击的按钮id
		 * @param menu:菜单对象实例
		 * @abstract
		 */
		onMenuEvent:function(id,menu,param){
			//默认不做实现
		}

	});
	
	return CommonView;

})

		
		